package com.sinosoft.dsp.system.to;

import java.io.IOException;
import java.util.List;

import org.w3c.dom.Node;

import com.sinosoft.dsp.system.core.exception.SinoException;
import com.sinosoft.dsp.system.to.attribute.Attribute;
import com.sinosoft.dsp.system.to.exception.SinoAttributeException;
import com.sinosoft.dsp.system.to.exception.SinoAttributeValidationException;

/**
 * TO的基础接口
 * 
 * @author 潘巍（Peter Pan）
 * @since 2010-9-8 下午05:17:15
 */
public interface IBaseTO extends Cloneable {
	/**
	 * 获得属性列表
	 * 
	 * @return
	 */
	public List<Attribute<?>> getAttributes();

	/**
	 * 获得属性名列表
	 * 
	 * @return
	 */
	public List<String> getAttributeNames();

	/**
	 * 属性是否存在
	 * 
	 * @param meta
	 * @return
	 */
	public boolean exists(Attribute<?> meta);

	/**
	 * 通过名称获得序号
	 * 
	 * @param name
	 * @return
	 */
	public int indexOf(String name);

	/**
	 * 添加一个属性
	 * 
	 * @param attribute
	 * @return
	 */
	public IBaseTO add(Attribute<?> attribute);

	/**
	 * 移除一个属性
	 * 
	 * @param name
	 * @return
	 */
	public Attribute<?> remove(String name);

	/**
	 * 通过序号得到一个属性
	 * 
	 * @param index
	 * @return
	 */
	public Attribute<?> getAttributeByIndex(int index);

	public Attribute<?> getAttributeByName(String name);

	/**
	 * 通过序号设置一个属性
	 * 
	 * @param index
	 * @param attribute
	 * @throws SinoAttributeException
	 */
	public IBaseTO set(int index, Attribute<?> attribute)
			throws SinoAttributeException;

	/**
	 * 移除一个属性
	 * 
	 * @param index
	 * @return
	 */
	public Attribute<?> remove(int index);

	/**
	 * 验证
	 * 
	 * @return
	 * @throws SinoAttributeValidationException
	 */
	public IBaseTO validate() throws SinoAttributeValidationException;

	/**
	 * 属性的数量
	 * 
	 * @return
	 */
	public int getNumberOfAttributes();

	/**
	 * 克隆对象
	 * 
	 * @return
	 * @throws SinoAttributeException
	 */
	public IBaseTO cloneTO() throws SinoAttributeException;

	/**
	 * 克隆所有属性
	 * 
	 * @return
	 * @throws SinoAttributeException
	 */
	public Attribute<?>[] cloneAttributes() throws SinoAttributeException;

	/**
	 * 将目标对象与本身对象进行比较
	 * 
	 * @param attr
	 * @param attrnrs
	 * @return
	 * @throws SinoAttributeException
	 */
	public int compare(Attribute<?>[] attr, int attrnrs[])
			throws SinoAttributeException;

	/**
	 * 判断是否相等
	 * 
	 * @param attr
	 * @param attrnrs
	 * @return
	 * @throws SinoAttributeException
	 */
	public boolean equals(Attribute<?>[] attr, int attrnrs[])
			throws SinoAttributeException;

	/**
	 * 
	 * @return TO对象的所有属性元数据的字符串描述
	 */
	public String toStringMeta();

	/**
	 * 
	 * @return TO元数据的XML描述
	 * @throws IOException
	 *             如果发生(Base64/GZip)编码问题
	 */
	public String getMetaXML() throws IOException;

	/**
	 * 转换一个XML的node为一个TO数据对象
	 * 
	 * @param node
	 *            数据TO的node
	 * @return 从XML反序列号的TO数据对象
	 * @throws SinoException
	 *             如果发生(Base64/GZip)编码问题
	 */
	public IBaseTO getByNode(Node node) throws SinoException;
}
